package com.tool_stdy.Reflect;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyDaili {

	public static void main(String[] args) {
		final Man man = new Man();
		/**
		 * 创建代理对象并实例化。
		 * 第一个参数 被代理对象的类加载器
		 * 第二个参数被代理对象所实现的接口
		 * 第三个参数是代理对象需要对被代理对象附加哪些操作。
		 * 
		 * 基于上述三个参数生成的代理对象就可以根据接口、类加载器来生成一个代理对象，然后这个代理对象具体执行的方法
		 * 根据InvokiHandle来执行。
		 */
		Person p =(Person)Proxy.newProxyInstance(Man.class.getClassLoader(),Man.class.getInterfaces(),new InvocationHandler() {
			/**
			 * proxy 代理对象实例
			 * method:当前代理的方法
			 * args 方法 的参数
			 */
			public Object invoke(Object proxy, Method method, Object[] args)
					throws Throwable {
					System.out.println("代理前..");
					//根据反射，传入需要执行哪个对象的方法，如下表示需要执行man对象的method方法
					Object invoke = method.invoke(man, null);
					System.out.println("代理后..");
				return invoke;
			}
		});
		p.eat();
	}
}
